package org.jeecg.modules.product.until;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

public class TicketGenerator {

    // 单例实例
    private static TicketGenerator instance;

    // 原子整型，用于生成当天的票号
    private AtomicInteger ticketNumber;

    // 保存当天的日期，用于重置判断
    private String currentDate;

    // 私有构造函数，防止外部实例化
    private TicketGenerator() {
        this.ticketNumber = new AtomicInteger(0);
        this.currentDate = getTodayDate();
    }

    // 获取单例实例
    public static synchronized TicketGenerator getInstance() {
        if (instance == null) {
            instance = new TicketGenerator();
        }
        return instance;
    }

    // 生成票号的方法
    public synchronized String generateTicketNumber() {
        String todayDate = getTodayDate();

        // 如果日期变更，重置票号
        if (!todayDate.equals(currentDate)) {
            this.ticketNumber.set(0);
            this.currentDate = todayDate;
        }

        // 生成并返回票号
        int newNumber = ticketNumber.incrementAndGet();
        return currentDate + String.format("%04d", newNumber);
    }

    // 获取当前日期的字符串表示（格式：yyyyMMdd）
    private String getTodayDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(new Date());
    }

    // 测试主方法
    public static void main(String[] args) {
        TicketGenerator generator = TicketGenerator.getInstance();

        // 模拟生成多个票号
        for (int i = 0; i < 20; i++) {
            String ticket = generator.generateTicketNumber();
            System.out.println("Generated Ticket: " + ticket);

            // 模拟等待到第二天（这里用睡眠来模拟）
            // 注意：实际使用中不能这样硬编码等待，需要根据实际情况处理日期的变更
            if (i == 20) {
                try {
                    Thread.sleep(24 * 60 * 60 * 1000); // 24小时
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}